package dao

import (
	"errors"
	"go.uber.org/zap"
	"gorm.io/gorm"
	"kf/models/entity"
)

// 自动回复
type SysAutoReplyDao struct {
	DB  *gorm.DB
	Log *zap.Logger
}

// 当前自动回复的消息
var CustomSysAutoReply []entity.SysAutoReply

// 查询所有的
func (sysAutoReplyDao *SysAutoReplyDao) FindAutoReplys() []entity.SysAutoReply {
	var autoReplies []entity.SysAutoReply
	err := sysAutoReplyDao.DB.Find(&autoReplies).Error
	if err != nil {
		sysAutoReplyDao.Log.Error("查询配置失败", zap.Error(err))
	}
	return autoReplies
}

// 初始化自动回复的消息
func (sysAutoReplyDao *SysAutoReplyDao) InitSysAutoReply() {
	CustomSysAutoReply = sysAutoReplyDao.FindAutoReplys()
}

// 查找键值
func (sysAutoReplyDao *SysAutoReplyDao) FindAutoReply(key string, lang string) string {
	for _, autoReply := range CustomSysAutoReply {
		if key == autoReply.ReplyKey && lang == autoReply.ReplyLang {
			return autoReply.ReplyValue
		}
	}
	return ""
}

// 获取分页
func (sysAutoReplyDao *SysAutoReplyDao) GetSysAutoReplyPage(page entity.AutoReplyPageQuery) ([]entity.SysAutoReply, error) {
	pageNum := *page.PageQuery.PageNum
	pageSize := *page.PageQuery.PageSize

	offset := (pageNum - 1) * pageSize
	if offset < 0 {
		offset = 0
	}

	var sysAutoReplys []entity.SysAutoReply
	tx := sysAutoReplyDao.DB.Model(&entity.SysAutoReply{})
	if page.Content != nil && *page.Content != "" {
		tx.Where("reply_value like ?", "%"+*page.Content+"%")
	}
	err := tx.Offset(int(offset)).Limit(int(pageSize)).Find(&sysAutoReplys).Error
	return sysAutoReplys, err
}

// 根据条件查询数据
func (sysAutoReplyDao *SysAutoReplyDao) GetSysAutoReplyCount(content *string) (int64, error) {
	var count int64
	tx := sysAutoReplyDao.DB.Model(&entity.SysAutoReply{})
	if content != nil && *content != "" {
		tx.Where("reply_value like ?", "%"+*content+"%")
	}
	err := tx.Count(&count).Error
	if err != nil {
		return count, err
	}
	return count, nil
}

func (sysAutoReplyDao *SysAutoReplyDao) UpdateAutoReply(reply entity.SysAutoReply) error {
	var autoReply entity.SysAutoReply
	sysAutoReplyDao.DB.Model(&entity.SysAutoReply{}).
		Where("id <> ? and reply_key = ? and reply_lang = ?", reply.ID, reply.ReplyKey, reply.ReplyLang).
		Find(&autoReply)
	if autoReply.ID != 0 {
		return errors.New("当前已有同样的自动回复数据")
	}
	err := sysAutoReplyDao.DB.Model(&entity.SysAutoReply{}).Where("id = ?", reply.ID).Updates(reply).Error
	if err != nil {
		return err
	}
	sysAutoReplyDao.InitSysAutoReply()
	return nil
}

func (sysAutoReplyDao *SysAutoReplyDao) SaveAutoReply(reply entity.SysAutoReply) error {
	var autoReply entity.SysAutoReply
	sysAutoReplyDao.DB.Model(&entity.SysAutoReply{}).
		Where(" reply_key = ? and reply_lang = ?", reply.ReplyKey, reply.ReplyLang).
		Find(&autoReply)
	if autoReply.ID != 0 {
		return errors.New("当前已有同样的自动回复数据")
	}
	err := sysAutoReplyDao.DB.Model(&entity.SysAutoReply{}).Save(&reply).Error
	if err != nil {
		return err
	}
	sysAutoReplyDao.InitSysAutoReply()
	return nil
}

func (sysAutoReplyDao *SysAutoReplyDao) DeleteAutoReply(id string) (bool, error) {
	err := sysAutoReplyDao.DB.Where("id = ?", id).Delete(&entity.SysAutoReply{}).Error
	if err != nil {
		return false, err
	}
	return true, nil
}
